package com.zx.JDK特性.jdk1_8;

import com.google.common.collect.Lists;
import com.zx.common.entity.Score;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 流是数据渠道，用于操作数据源（集合、数组等）所生成的元素序列。
 * ①Stream自己不会存储元素。
 * ②Stream不会改变源对象。相反，会返回持有新结果的新Stream。
 * ③Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
 */
public class Stream9_案例 {


    public static void main(final String[] args) {
        final List<Score> list = Lists.newArrayList(
                new Score("张三", 100, 80, 40),
                new Score("李四", 70, 70, 79),
                new Score("王五", 85, 50, 49),
                new Score("赵六", 77, 80, 80),
                new Score("老王", 59, 99, 79)
        );
        // ## 常用做法 ##
        // 1. 获得语文大于80分的学生
        final List<Score> c1 = list.stream().filter(ele -> ele.getYuwen() >= 80).collect(Collectors.toList());
        System.out.println(c1);

        // 2. 获得语文成绩最高的
        final Score c2 = list.stream().max((s1, s2) -> s1.getYuwen().compareTo(s2.getYuwen())).get();
        System.out.println(c2);

        // ## 高级做法 ##
        // 1. 各个成绩之和
        final Score r1 = list.stream().reduce(
                new Score("", 0, 0, 0),// 初始值
                (sum, score) -> sum.addShuxue(score.getShuxue()).addYingyu(score.getYingyu()).addYuwen(score.getYuwen())
                // 累加器
        );
        System.out.println(r1);

        // 2. 拼接字符串
        final String s1 = list.stream().map(Score::getStudentName).collect(Collectors.joining("|"));
        System.out.println(s1);
    }


}
